IMPORTING LIBRARIES¶

In [1]:
import pandas as pd
import numpy as np

IMPORTING THE DATASET & PREPROCESSING¶

In [3]:
data = pd.read_csv("zomato.csv",encoding="latin-1")
In [4]:
data.shape
Out[4]:
(9551, 21)
In [5]:
data.head()
Out[5]:
Restaurant ID Restaurant Name Country Code City Address Locality Locality Verbose Longitude Latitude Cuisines ... Currency Has Table booking Has Online delivery Is delivering now Switch to order menu Price range Aggregate rating Rating color Rating text Votes
0 6317637 Le Petit Souffle 162 Makati City Third Floor, Century City Mall, Kalayaan Avenu... Century City Mall, Poblacion, Makati City Century City Mall, Poblacion, Makati City, Mak... 121.027535 14.565443 French, Japanese, Desserts ... Botswana Pula(P) Yes No No No 3 4.8 Dark Green Excellent 314
1 6304287 Izakaya Kikufuji 162 Makati City Little Tokyo, 2277 Chino Roces Avenue, Legaspi... Little Tokyo, Legaspi Village, Makati City Little Tokyo, Legaspi Village, Makati City, Ma... 121.014101 14.553708 Japanese ... Botswana Pula(P) Yes No No No 3 4.5 Dark Green Excellent 591
2 6300002 Heat - Edsa Shangri-La 162 Mandaluyong City Edsa Shangri-La, 1 Garden Way, Ortigas, Mandal... Edsa Shangri-La, Ortigas, Mandaluyong City Edsa Shangri-La, Ortigas, Mandaluyong City, Ma... 121.056831 14.581404 Seafood, Asian, Filipino, Indian ... Botswana Pula(P) Yes No No No 4 4.4 Green Very Good 270
3 6318506 Ooma 162 Mandaluyong City Third Floor, Mega Fashion Hall, SM Megamall, O... SM Megamall, Ortigas, Mandaluyong City SM Megamall, Ortigas, Mandaluyong City, Mandal... 121.056475 14.585318 Japanese, Sushi ... Botswana Pula(P) No No No No 4 4.9 Dark Green Excellent 365
4 6314302 Sambo Kojin 162 Mandaluyong City Third Floor, Mega Atrium, SM Megamall, Ortigas... SM Megamall, Ortigas, Mandaluyong City SM Megamall, Ortigas, Mandaluyong City, Mandal... 121.057508 14.584450 Japanese, Korean ... Botswana Pula(P) Yes No No No 4 4.8 Dark Green Excellent 229

5 rows × 21 columns

EXPLORATORY DATA ANALYSIS (EDA)¶

In [6]:
data.dtypes
Out[6]:
Restaurant ID             int64
Restaurant Name          object
Country Code              int64
City                     object
Address                  object
Locality                 object
Locality Verbose         object
Longitude               float64
Latitude                float64
Cuisines                 object
Average Cost for two      int64
Currency                 object
Has Table booking        object
Has Online delivery      object
Is delivering now        object
Switch to order menu     object
Price range               int64
Aggregate rating        float64
Rating color             object
Rating text              object
Votes                     int64
dtype: object

Info about the data frame¶

In [7]:
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9551 entries, 0 to 9550
Data columns (total 21 columns):
 #   Column                Non-Null Count  Dtype  
---  ------                --------------  -----  
 0   Restaurant ID         9551 non-null   int64  
 1   Restaurant Name       9551 non-null   object 
 2   Country Code          9551 non-null   int64  
 3   City                  9551 non-null   object 
 4   Address               9551 non-null   object 
 5   Locality              9551 non-null   object 
 6   Locality Verbose      9551 non-null   object 
 7   Longitude             9551 non-null   float64
 8   Latitude              9551 non-null   float64
 9   Cuisines              9542 non-null   object 
 10  Average Cost for two  9551 non-null   int64  
 11  Currency              9551 non-null   object 
 12  Has Table booking     9551 non-null   object 
 13  Has Online delivery   9551 non-null   object 
 14  Is delivering now     9551 non-null   object 
 15  Switch to order menu  9551 non-null   object 
 16  Price range           9551 non-null   int64  
 17  Aggregate rating      9551 non-null   float64
 18  Rating color          9551 non-null   object 
 19  Rating text           9551 non-null   object 
 20  Votes                 9551 non-null   int64  
dtypes: float64(3), int64(5), object(13)
memory usage: 1.5+ MB
In [8]:
data.Votes.max()
Out[8]:
10934
In [9]:
data.isnull()
Out[9]:
Restaurant ID Restaurant Name Country Code City Address Locality Locality Verbose Longitude Latitude Cuisines ... Currency Has Table booking Has Online delivery Is delivering now Switch to order menu Price range Aggregate rating Rating color Rating text Votes
0 False False False False False False False False False False ... False False False False False False False False False False
1 False False False False False False False False False False ... False False False False False False False False False False
2 False False False False False False False False False False ... False False False False False False False False False False
3 False False False False False False False False False False ... False False False False False False False False False False
4 False False False False False False False False False False ... False False False False False False False False False False
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
9546 False False False False False False False False False False ... False False False False False False False False False False
9547 False False False False False False False False False False ... False False False False False False False False False False
9548 False False False False False False False False False False ... False False False False False False False False False False
9549 False False False False False False False False False False ... False False False False False False False False False False
9550 False False False False False False False False False False ... False False False False False False False False False False

9551 rows × 21 columns

In [10]:
data.isnull().sum()
Out[10]:
Restaurant ID           0
Restaurant Name         0
Country Code            0
City                    0
Address                 0
Locality                0
Locality Verbose        0
Longitude               0
Latitude                0
Cuisines                9
Average Cost for two    0
Currency                0
Has Table booking       0
Has Online delivery     0
Is delivering now       0
Switch to order menu    0
Price range             0
Aggregate rating        0
Rating color            0
Rating text             0
Votes                   0
dtype: int64
Only the column Cuisine has null values and total number of null values in Cuisine is 9.¶
In [11]:
data.shape
Out[11]:
(9551, 21)

9551 rows and 19 columns

In [12]:
data.head()
Out[12]:
Restaurant ID Restaurant Name Country Code City Address Locality Locality Verbose Longitude Latitude Cuisines ... Currency Has Table booking Has Online delivery Is delivering now Switch to order menu Price range Aggregate rating Rating color Rating text Votes
0 6317637 Le Petit Souffle 162 Makati City Third Floor, Century City Mall, Kalayaan Avenu... Century City Mall, Poblacion, Makati City Century City Mall, Poblacion, Makati City, Mak... 121.027535 14.565443 French, Japanese, Desserts ... Botswana Pula(P) Yes No No No 3 4.8 Dark Green Excellent 314
1 6304287 Izakaya Kikufuji 162 Makati City Little Tokyo, 2277 Chino Roces Avenue, Legaspi... Little Tokyo, Legaspi Village, Makati City Little Tokyo, Legaspi Village, Makati City, Ma... 121.014101 14.553708 Japanese ... Botswana Pula(P) Yes No No No 3 4.5 Dark Green Excellent 591
2 6300002 Heat - Edsa Shangri-La 162 Mandaluyong City Edsa Shangri-La, 1 Garden Way, Ortigas, Mandal... Edsa Shangri-La, Ortigas, Mandaluyong City Edsa Shangri-La, Ortigas, Mandaluyong City, Ma... 121.056831 14.581404 Seafood, Asian, Filipino, Indian ... Botswana Pula(P) Yes No No No 4 4.4 Green Very Good 270
3 6318506 Ooma 162 Mandaluyong City Third Floor, Mega Fashion Hall, SM Megamall, O... SM Megamall, Ortigas, Mandaluyong City SM Megamall, Ortigas, Mandaluyong City, Mandal... 121.056475 14.585318 Japanese, Sushi ... Botswana Pula(P) No No No No 4 4.9 Dark Green Excellent 365
4 6314302 Sambo Kojin 162 Mandaluyong City Third Floor, Mega Atrium, SM Megamall, Ortigas... SM Megamall, Ortigas, Mandaluyong City SM Megamall, Ortigas, Mandaluyong City, Mandal... 121.057508 14.584450 Japanese, Korean ... Botswana Pula(P) Yes No No No 4 4.8 Dark Green Excellent 229

5 rows × 21 columns

TREATING NULL VALUES¶

We have null values in the cuisine column but dropping the rows having null cuisine values may affect our analysis at a later stage, plus it is very less in number, so we fill the missing value with NaN or we can just leave it as it is.¶

In [13]:
## first lets check what type of values are there in cuisine column

print(data.Cuisines.dtypes)
object

So the data type is Object, we can replace the missing values with NaN

In [14]:
## filling the missing values in Cuisines column with NaN

data['Cuisines'] = data['Cuisines'].fillna('NaN')
In [15]:
data.isnull().sum()
Out[15]:
Restaurant ID           0
Restaurant Name         0
Country Code            0
City                    0
Address                 0
Locality                0
Locality Verbose        0
Longitude               0
Latitude                0
Cuisines                0
Average Cost for two    0
Currency                0
Has Table booking       0
Has Online delivery     0
Is delivering now       0
Switch to order menu    0
Price range             0
Aggregate rating        0
Rating color            0
Rating text             0
Votes                   0
dtype: int64

No null values in Cuisines or any other columns

In [16]:
data.head()
Out[16]:
Restaurant ID Restaurant Name Country Code City Address Locality Locality Verbose Longitude Latitude Cuisines ... Currency Has Table booking Has Online delivery Is delivering now Switch to order menu Price range Aggregate rating Rating color Rating text Votes
0 6317637 Le Petit Souffle 162 Makati City Third Floor, Century City Mall, Kalayaan Avenu... Century City Mall, Poblacion, Makati City Century City Mall, Poblacion, Makati City, Mak... 121.027535 14.565443 French, Japanese, Desserts ... Botswana Pula(P) Yes No No No 3 4.8 Dark Green Excellent 314
1 6304287 Izakaya Kikufuji 162 Makati City Little Tokyo, 2277 Chino Roces Avenue, Legaspi... Little Tokyo, Legaspi Village, Makati City Little Tokyo, Legaspi Village, Makati City, Ma... 121.014101 14.553708 Japanese ... Botswana Pula(P) Yes No No No 3 4.5 Dark Green Excellent 591
2 6300002 Heat - Edsa Shangri-La 162 Mandaluyong City Edsa Shangri-La, 1 Garden Way, Ortigas, Mandal... Edsa Shangri-La, Ortigas, Mandaluyong City Edsa Shangri-La, Ortigas, Mandaluyong City, Ma... 121.056831 14.581404 Seafood, Asian, Filipino, Indian ... Botswana Pula(P) Yes No No No 4 4.4 Green Very Good 270
3 6318506 Ooma 162 Mandaluyong City Third Floor, Mega Fashion Hall, SM Megamall, O... SM Megamall, Ortigas, Mandaluyong City SM Megamall, Ortigas, Mandaluyong City, Mandal... 121.056475 14.585318 Japanese, Sushi ... Botswana Pula(P) No No No No 4 4.9 Dark Green Excellent 365
4 6314302 Sambo Kojin 162 Mandaluyong City Third Floor, Mega Atrium, SM Megamall, Ortigas... SM Megamall, Ortigas, Mandaluyong City SM Megamall, Ortigas, Mandaluyong City, Mandal... 121.057508 14.584450 Japanese, Korean ... Botswana Pula(P) Yes No No No 4 4.8 Dark Green Excellent 229

5 rows × 21 columns

We have another data set which is country code, it contains the data about the country code and the corresponding country to it.¶

Let us load that data set first

In [18]:
data1 = pd.read_excel("Country-Code.xlsx")
data1.head()
Out[18]:
Country Code Country
0 1 India
1 14 Australia
2 30 Brazil
3 37 Canada
4 94 Indonesia

Let us first know about the shape and other relevant characteristics of this data set¶

In [19]:
data1.shape
Out[19]:
(15, 2)

15 rows and 2 columns

In [20]:
data1.describe()
Out[20]:
Country Code
count 15.000000
mean 137.933333
std 80.009345
min 1.000000
25% 65.500000
50% 166.000000
75% 199.500000
max 216.000000

Does not make sense to calculate mean, median etc for Country_Code, data1.describe is just done for the sake of it

In [21]:
data1.dtypes
Out[21]:
Country Code     int64
Country         object
dtype: object

Information about the data type of the two columns

Let us check for null values in the Country_Code dataset¶

In [22]:
data1.isnull()
Out[22]:
Country Code Country
0 False False
1 False False
2 False False
3 False False
4 False False
5 False False
6 False False
7 False False
8 False False
9 False False
10 False False
11 False False
12 False False
13 False False
14 False False

We can glance on our result and infer that there are no null values

Let us gather some information about our Country_Code data set¶

In [23]:
data1.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15 entries, 0 to 14
Data columns (total 2 columns):
 #   Column        Non-Null Count  Dtype 
---  ------        --------------  ----- 
 0   Country Code  15 non-null     int64 
 1   Country       15 non-null     object
dtypes: int64(1), object(1)
memory usage: 372.0+ bytes

Information about the Country_Code data frame

Now we need to merge zomato dataset to Country_Code dataset to understand which country code belongs to which country. It will also help us in our analysis later.¶

In [24]:
final_data=pd.merge(data,data1,on='Country Code',how='left')
final_data.head()
Out[24]:
Restaurant ID Restaurant Name Country Code City Address Locality Locality Verbose Longitude Latitude Cuisines ... Has Table booking Has Online delivery Is delivering now Switch to order menu Price range Aggregate rating Rating color Rating text Votes Country
0 6317637 Le Petit Souffle 162 Makati City Third Floor, Century City Mall, Kalayaan Avenu... Century City Mall, Poblacion, Makati City Century City Mall, Poblacion, Makati City, Mak... 121.027535 14.565443 French, Japanese, Desserts ... Yes No No No 3 4.8 Dark Green Excellent 314 Phillipines
1 6304287 Izakaya Kikufuji 162 Makati City Little Tokyo, 2277 Chino Roces Avenue, Legaspi... Little Tokyo, Legaspi Village, Makati City Little Tokyo, Legaspi Village, Makati City, Ma... 121.014101 14.553708 Japanese ... Yes No No No 3 4.5 Dark Green Excellent 591 Phillipines
2 6300002 Heat - Edsa Shangri-La 162 Mandaluyong City Edsa Shangri-La, 1 Garden Way, Ortigas, Mandal... Edsa Shangri-La, Ortigas, Mandaluyong City Edsa Shangri-La, Ortigas, Mandaluyong City, Ma... 121.056831 14.581404 Seafood, Asian, Filipino, Indian ... Yes No No No 4 4.4 Green Very Good 270 Phillipines
3 6318506 Ooma 162 Mandaluyong City Third Floor, Mega Fashion Hall, SM Megamall, O... SM Megamall, Ortigas, Mandaluyong City SM Megamall, Ortigas, Mandaluyong City, Mandal... 121.056475 14.585318 Japanese, Sushi ... No No No No 4 4.9 Dark Green Excellent 365 Phillipines
4 6314302 Sambo Kojin 162 Mandaluyong City Third Floor, Mega Atrium, SM Megamall, Ortigas... SM Megamall, Ortigas, Mandaluyong City SM Megamall, Ortigas, Mandaluyong City, Mandal... 121.057508 14.584450 Japanese, Korean ... Yes No No No 4 4.8 Dark Green Excellent 229 Phillipines

5 rows × 22 columns

In [25]:
final_data.shape
Out[25]:
(9551, 22)

We see that both the data sets are now merged.¶

We now have 9551 entries which are the total number of restaurants listed on Zomato world wide and corresponding to those 9551 restaurants we have 17 columns which gives us a brief description about a particular restaurant. This concludes our data cleaning part. Let us now move onto our analysis part.

Data Analysis¶

Brief description of the data set:¶

We have a data set which has 17 columns each of which tells us about a particular attribute of a restaurant. We will now try to¶

analyse and generalise it, so that even a layman can understand our analysis and gain knowledge about the food chain giant Zomato.¶

Let us find out which country has the highest number of restaurants listed on Zomato

In [26]:
final_data.Country.value_counts()
Out[26]:
India             8652
United States      434
United Kingdom      80
Brazil              60
UAE                 60
South Africa        60
New Zealand         40
Turkey              34
Australia           24
Phillipines         22
Indonesia           21
Singapore           20
Qatar               20
Sri Lanka           20
Canada               4
Name: Country, dtype: int64

It is clear from the above values that India has the highest number of restaurants.

In [27]:
final_data.Country
Out[27]:
0       Phillipines
1       Phillipines
2       Phillipines
3       Phillipines
4       Phillipines
           ...     
9546         Turkey
9547         Turkey
9548         Turkey
9549         Turkey
9550         Turkey
Name: Country, Length: 9551, dtype: object
In [28]:
country_name = final_data.Country.value_counts().index
country_name
Out[28]:
Index(['India', 'United States', 'United Kingdom', 'Brazil', 'UAE',
       'South Africa', 'New Zealand', 'Turkey', 'Australia', 'Phillipines',
       'Indonesia', 'Singapore', 'Qatar', 'Sri Lanka', 'Canada'],
      dtype='object')
In [29]:
country_value = final_data.Country.value_counts().values
country_value
Out[29]:
array([8652,  434,   80,   60,   60,   60,   40,   34,   24,   22,   21,
         20,   20,   20,    4], dtype=int64)

UNIVARIETE ANALYSIS¶

To get a visualise about how the number the retsaurants are distributed let us plot a pie chart¶

In [30]:
import plotly.graph_objects as plt

labels = country_name
values = country_value

fig = plt.Figure(data=[plt.Pie(labels=labels[:5], values=values[:5])])
fig.show()

This pie chart clearly visualises that Zomato is India based, as India accounts for 93.2% of the total restaurants listed on Zomato in the whole world. United States is second with only 4.67% of the total number of restaurants. We can also almost vaguely and roughly assume that Zomato is an Indian company.

Let us understand the rating distribution of the restaurants.¶

In [31]:
ratings = data.groupby(['Aggregate rating','Rating color', 'Rating text']).size().reset_index().rename(columns={0:'Rating Count'})
ratings
Out[31]:
Aggregate rating Rating color Rating text Rating Count
0 0.0 White Not rated 2148
1 1.8 Red Poor 1
2 1.9 Red Poor 2
3 2.0 Red Poor 7
4 2.1 Red Poor 15
5 2.2 Red Poor 27
6 2.3 Red Poor 47
7 2.4 Red Poor 87
8 2.5 Orange Average 110
9 2.6 Orange Average 191
10 2.7 Orange Average 250
11 2.8 Orange Average 315
12 2.9 Orange Average 381
13 3.0 Orange Average 468
14 3.1 Orange Average 519
15 3.2 Orange Average 522
16 3.3 Orange Average 483
17 3.4 Orange Average 498
18 3.5 Yellow Good 480
19 3.6 Yellow Good 458
20 3.7 Yellow Good 427
21 3.8 Yellow Good 400
22 3.9 Yellow Good 335
23 4.0 Green Very Good 266
24 4.1 Green Very Good 274
25 4.2 Green Very Good 221
26 4.3 Green Very Good 174
27 4.4 Green Very Good 144
28 4.5 Dark Green Excellent 95
29 4.6 Dark Green Excellent 78
30 4.7 Dark Green Excellent 42
31 4.8 Dark Green Excellent 25
32 4.9 Dark Green Excellent 61

We can easily observe the table and find how the ratings are ditributed, the color associated with each rating and also the number of the reviews each rating has received.

Rating 0 - White - Not rated

Rating 1.8 to 2.4 - Red - Poor

Rating 2.5 to 3.4 - Orange - Average

Rating 3.5 to 3.9 - Yellow - Good

Rating 4.0 to 4.4 - Green - Very Good

Rating 4.5 to 4.9 - Dark Green - Excellent

DATA VISUALISATION¶

Let us see a visualisation of the ratings which will help us understand the rating distribution better.¶

In [32]:
import plotly.express as px

fig = px.bar(ratings,
                   x='Rating color',
                   #marginal='box',
                   color='Rating text',
             y='Rating Count',
                   color_discrete_sequence=['White', 'Red','Orange','Yellow','Green',"Darkgreen"],
                   title='Rating Distribution')
fig.update_layout(bargap=0.1)
fig.show()

Observations: Not rated count is very high, we need to see what is the cause of it.

Clearly, among all the restaurants, orange rated(average)(2.5-3.4) is the most common frequent rating.

Let us see which country has the highest number of unrated restaurants.¶

In [33]:
No_rating = final_data[final_data['Rating color']=='White'].groupby('Country').size().reset_index().rename(columns={0:'Rating Count'})
No_rating
Out[33]:
Country Rating Count
0 Brazil 5
1 India 2139
2 United Kingdom 1
3 United States 3

We see that India has come out on top. :p

This can be because Indians are still coming to terms with online food ordering or it can be that we just like to sit back and relax after having our food. :D

Bar chart visualisation of the rating distribution¶

In [34]:
import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(12,6))
sns.barplot(x='Aggregate rating',y='Rating Count',data=ratings)
plt.show()

We see that the highest number of ratings recieved is around 3.0 to 3.8, this may happen because the number of restaurants which have high rating is low in number. India has the most number of restaurants and many restaurants fall into the bucket of 3 to 4 rating range. So this might be affecting our analysis here.

Let us understand what currency each country uses¶

In [35]:
country_currency = final_data[['Country','Currency']].groupby(['Country','Currency']).size().reset_index(name='count').drop('count', axis=1, inplace=False)
country_currency
Out[35]:
Country Currency
0 Australia Dollar($)
1 Brazil Brazilian Real(R$)
2 Canada Dollar($)
3 India Indian Rupees(Rs.)
4 Indonesia Indonesian Rupiah(IDR)
5 New Zealand NewZealand($)
6 Phillipines Botswana Pula(P)
7 Qatar Qatari Rial(QR)
8 Singapore Dollar($)
9 South Africa Rand(R)
10 Sri Lanka Sri Lankan Rupee(LKR)
11 Turkey Turkish Lira(TL)
12 UAE Emirati Diram(AED)
13 United Kingdom Pounds(Σ)
14 United States Dollar($)

We observe and can easily find out which country uses what currency.

Let us observe the percentage of total countries having online ordering services.¶

In [36]:
fig = px.pie(final_data, names="Has Online delivery", title='Online Deliveries')
fig.show()

We see that 74% or almost 3/4th of the total restaurants do not accept online orders. This may be due to a variety of reasons such as, maybe the restaurants are of small scale therefore they do not have enough profit margin while selling through zomato, or the restaurant is of huge scale. I have been to some restaurants where the prices start at Rs. 800-900 for just one dish! This makes it clear that such restaurants will not be having online food deliveries, because after a meal, just the tax is around 300-400, with which we can have a full fledged meal at a good restaurant. I would like to add that some restaurants simply do not want to deliver online, because they choose not to, do not want the hassle or maybe due some orthodox beliefs. These restaurants are small scale, but large in number.

Let us dive further into this and find out country wise how many online delivery restaurants are there.¶

In [37]:
country_online_delivery = final_data[["Has Online delivery", 'Country']].groupby(["Has Online delivery", 'Country']).size().reset_index(name='Count')
country_online_delivery
Out[37]:
Has Online delivery Country Count
0 No Australia 24
1 No Brazil 60
2 No Canada 4
3 No India 6229
4 No Indonesia 21
5 No New Zealand 40
6 No Phillipines 22
7 No Qatar 20
8 No Singapore 20
9 No South Africa 60
10 No Sri Lanka 20
11 No Turkey 34
12 No UAE 32
13 No United Kingdom 80
14 No United States 434
15 Yes India 2423
16 Yes UAE 28

Only India and UAE have online delivery, India tops the list of having most number of restaurants having online deliveries. All other countries do not deliver online. India also tops the list of countries having restaurants not delivering online. Shows that India is a leader.

Let us gather some information on cuisines.¶

Extarcting the top 25 restaurants.

In [38]:
final_data.loc[final_data['Rating text'].isin(['Excellent'])].Cuisines.value_counts().sort_values(ascending=False).reset_index().head()
Out[38]:
index Cuisines
0 Cafe 8
1 North Indian 7
2 Italian 7
3 Indian 5
4 Seafood 5

Fetching the resturants having 'Excellent' and 'Very Good' rating

In [39]:
good_cuisine = final_data.loc[final_data['Rating text'].isin(['Excellent'])]

good_cuisine = good_cuisine.Cuisines.value_counts().reset_index().head(25)

## Extracing all the cuisens in a single list
cuisines = []

# Iterate over the 'Cuisines' column in the DataFrame
for cuisine in good_cuisine['Cuisines']:
  cuisines.append(cuisine)

cuisines
Out[39]:
[8, 7, 7, 5, 5, 5, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3]
In [41]:
sns.barplot(y = 'index', x = 'Cuisines', data = good_cuisine) # Use 'count' instead of 'counts' for y-axis
plt.show()

Graph shows us the number of cuisines each type of restaurant has. As expected Cafes serve the most number of cuisines and Bakery, Deserts serving the the least number of cuisines.

25 costly restaurants for 2 people around the globe:¶

In [42]:
costly_zomato = final_data.nlargest(25, 'Average Cost for two')
costly_zomato
Out[42]:
Restaurant ID Restaurant Name Country Code City Address Locality Locality Verbose Longitude Latitude Cuisines ... Has Table booking Has Online delivery Is delivering now Switch to order menu Price range Aggregate rating Rating color Rating text Votes Country
9283 7402935 Skye 94 Jakarta Menara BCA, Lantai 56, Jl. MH. Thamrin, Thamri... Grand Indonesia Mall, Thamrin Grand Indonesia Mall, Thamrin, Jakarta 106.821999 -6.196778 Italian, Continental ... No No No No 3 4.1 Green Very Good 1498 Indonesia
9284 7410290 Satoo - Hotel Shangri-La 94 Jakarta Hotel Shangri-La, Jl. Jend. Sudirman Hotel Shangri-La, Sudirman Hotel Shangri-La, Sudirman, Jakarta 106.818961 -6.203292 Asian, Indonesian, Western ... No No No No 3 4.6 Dark Green Excellent 873 Indonesia
9287 7420899 Sushi Masa 94 Jakarta Jl. Tuna Raya No. 5, Penjaringan Penjaringan Penjaringan, Jakarta 106.800144 -6.101298 Sushi, Japanese ... No No No No 3 4.9 Dark Green Excellent 605 Indonesia
9289 7421967 3 Wise Monkeys 94 Jakarta Jl. Suryo No. 26, Senopati, Jakarta Senopati Senopati, Jakarta 106.813400 -6.235241 Japanese ... No No No No 3 4.2 Green Very Good 395 Indonesia
9294 7422489 Avec Moi Restaurant and Bar 94 Jakarta Gedung PIC, Jl. Teluk Betung 43, Thamrin, Jakarta Thamrin Thamrin, Jakarta 106.821023 -6.196270 French, Western ... No No No No 3 4.3 Green Very Good 243 Indonesia
9288 18352452 Lucky Cat Coffee & Kitchen 94 Jakarta Plaza Festival, South Parking, Jl. HR Rasuna S... Plaza Festival, Kuningan Plaza Festival, Kuningan, Jakarta 106.831748 -6.218932 Cafe, Western ... No No No No 3 4.3 Green Very Good 458 Indonesia
9295 18386856 Onokabe 94 Tangerang Alam Sutera Town Center, Jl. Alam Utama, Serpo... Alam Sutera Town Center, Serpong Utara Alam Sutera Town Center, Serpong Utara, Tangerang 106.652688 -6.241792 Indonesian ... No No No No 3 3.7 Yellow Good 155 Indonesia
9278 7423482 Lemongrass 94 Bogor Jl. Raya Pajajaran No. 21, Bogor Utara, Bogor Bogor Utara Bogor Utara, Bogor 106.807850 -6.576578 Peranakan, Indonesian ... No No No No 3 4.0 Green Very Good 1159 Indonesia
9285 18391256 MONKS 94 Jakarta Komplek Graha Boulevard Timur, Summarecon Kela... Kelapa Gading Kelapa Gading, Jakarta 106.911335 -6.163948 Western, Asian, Cafe ... No No No No 3 4.2 Green Very Good 259 Indonesia
9279 7422633 Talaga Sampireun 94 Jakarta Jl. Lingkar Luar Barat Cengkareng Cengkareng, Jakarta 106.728508 -6.168467 Sunda, Indonesian ... No No No No 3 4.9 Dark Green Excellent 1662 Indonesia
9281 18425821 OJJU 94 Jakarta Gandaria City, Lantai Upper Ground, Jl. Sultan... Gandaria City Mall, Gandaria Gandaria City Mall, Gandaria, Jakarta 106.783162 -6.244221 Korean ... No No No No 3 3.9 Yellow Good 137 Indonesia
9282 7422751 Union Deli 94 Jakarta Grand Indonesia Mall, Lantai Ground, East Mall... Grand Indonesia Mall, Thamrin Grand Indonesia Mall, Thamrin, Jakarta 106.819749 -6.197150 Desserts, Bakery, Western ... No No No No 3 4.6 Dark Green Excellent 903 Indonesia
9286 7400818 Zenbu 94 Jakarta Kota Kasablanka, Lantai Upper Ground, Food Soc... Kota Kasablanka, Tebet Kota Kasablanka, Tebet, Jakarta 106.842500 -6.224333 Japanese, Sushi, Ramen ... No No No No 3 4.4 Green Very Good 841 Indonesia
9291 7417455 Talaga Sampireun 94 Jakarta Taman Impian Jaya Ancol, Jl. Lapangan Golf 7, ... Taman Impian Jaya Ancol, Ancol Taman Impian Jaya Ancol, Ancol, Jakarta 106.833553 -6.126860 Sunda, Indonesian ... No No No No 3 4.9 Dark Green Excellent 1640 Indonesia
9296 7417450 Talaga Sampireun 94 Tangerang Jl. Boulevard Bintaro Jaya Blok B7/N1, Bintaro... Pondok Aren Pondok Aren, Tangerang 106.726119 -6.269914 Sunda, Indonesian ... No No No No 3 4.9 Dark Green Excellent 2212 Indonesia
9280 7405789 Toodz House 94 Jakarta Jl. Cipete Raya No. 79, Fatmawati, Jakarta Fatmawati Fatmawati, Jakarta 106.801782 -6.278012 Cafe, Italian, Coffee and Tea, Western, Indone... ... No No No No 3 4.6 Dark Green Excellent 1476 Indonesia
9276 18400530 Noah's Barn Coffeenery 94 Bandung Jl. Dayang Sumbi No. 2, Dago, Bandung Dago Dago, Bandung 107.612790 -6.887058 Cafe, Coffee and Tea, Western ... No No No No 3 4.2 Green Very Good 22 Indonesia
9290 18370659 Flip Burger 94 Jakarta Jl. Senopati No. 27, Senopati, Jakarta Senopati Senopati, Jakarta 106.808550 -6.230775 Burger ... No No No No 3 4.4 Green Very Good 410 Indonesia
9292 18409146 Fish Streat 94 Jakarta Jl. Tanjung Duren Utara III, Blok M Kav. 32, T... Tanjung Duren Tanjung Duren, Jakarta 0.000000 0.000000 Seafood, Western ... No No No No 3 3.4 Orange Average 152 Indonesia
9293 18408381 Fish Streat 94 Jakarta Jl. Tebet Timur Dalam Raya 44B, Tebet, Jakarta Tebet Tebet, Jakarta 106.856413 -6.232816 Seafood, Western ... No No No No 3 4.0 Green Very Good 331 Indonesia
9277 7423620 Momo Milk 94 Bogor Jl. Kantor Pos No. 6, Bogor Timur, Bogor Bogor Timur Bogor Timur, Bogor 106.810301 -6.606917 Cafe, Desserts, Beverages ... No No No No 2 3.7 Yellow Good 783 Indonesia
7543 2701 Orient Express - Taj Palace Hotel 1 New Delhi Taj Palace Hotel, Diplomatic Enclave, Chanakya... The Taj Palace Hotel, Chanakyapuri The Taj Palace Hotel, Chanakyapuri, New Delhi 77.170087 28.595008 European ... Yes No No No 4 4.0 Green Very Good 145 India
4088 309548 Tian - Asian Cuisine Studio - ITC Maurya 1 New Delhi ITC Maurya, Diplomatic Enclave, Chanakyapuri, ... ITC Maurya, Chanakyapuri ITC Maurya, Chanakyapuri, New Delhi 77.173455 28.597351 Asian, Japanese, Korean, Thai, Chinese ... No No No No 4 4.1 Green Very Good 188 India
4087 2742 Bukhara - ITC Maurya 1 New Delhi ITC Maurya, Chanakyapuri, New Delhi ITC Maurya, Chanakyapuri ITC Maurya, Chanakyapuri, New Delhi 77.173724 28.597466 North Indian ... No No No No 4 4.4 Green Very Good 2826 India
8 6300010 Spiral - Sofitel Philippine Plaza Manila 162 Pasay City Plaza Level, Sofitel Philippine Plaza Manila, ... Sofitel Philippine Plaza Manila, Pasay City Sofitel Philippine Plaza Manila, Pasay City, P... 120.980090 14.552990 European, Asian, Indian ... Yes No No No 4 4.9 Dark Green Excellent 621 Phillipines

25 rows × 22 columns

In [43]:
costly_zomato.columns
Out[43]:
Index(['Restaurant ID', 'Restaurant Name', 'Country Code', 'City', 'Address',
       'Locality', 'Locality Verbose', 'Longitude', 'Latitude', 'Cuisines',
       'Average Cost for two', 'Currency', 'Has Table booking',
       'Has Online delivery', 'Is delivering now', 'Switch to order menu',
       'Price range', 'Aggregate rating', 'Rating color', 'Rating text',
       'Votes', 'Country'],
      dtype='object')
In [44]:
fig = px.bar(costly_zomato,
                   x='Restaurant Name',
                   color='City',
                 y='Average Cost for two',
                 title='Costly restaurants around the globe for 2 people')
fig.update_layout(bargap=0.1)
fig.show()

This graph shows us the costly restaurants around the globe for two people. City of Jakarta leads with the least being Bogor.

Top 25 costly Resturants' Locations¶

In [45]:
final_data.columns
Out[45]:
Index(['Restaurant ID', 'Restaurant Name', 'Country Code', 'City', 'Address',
       'Locality', 'Locality Verbose', 'Longitude', 'Latitude', 'Cuisines',
       'Average Cost for two', 'Currency', 'Has Table booking',
       'Has Online delivery', 'Is delivering now', 'Switch to order menu',
       'Price range', 'Aggregate rating', 'Rating color', 'Rating text',
       'Votes', 'Country'],
      dtype='object')
In [46]:
import plotly.express as px

fig = px.scatter_mapbox(final_data, lat="Latitude", lon="Longitude", hover_name="City", hover_data=["Aggregate rating",
                                                                                            "Restaurant Name","Average Cost for two",
                                                                                            "Price range", 'Rating text'],
                        color_discrete_sequence=["green"], zoom=10, height=300)

fig.update_layout(mapbox_style="open-street-map")
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
fig.update_layout(title='Top 25 costly Resturants Location',
                  autosize=True,
                  showlegend=False)

fig.update_layout(
    autosize=False,
    width=800,
    height=500,)

fig.show()

Map displaying all the places where there are costly restaurants for two.

In [47]:
final_data[(final_data['Average Cost for two']<10000) & (final_data['Aggregate rating']!=0)].plot.scatter(x = 'Average Cost for two', y = 'Aggregate rating', figsize=(15,7), title="The dependence of the rating on the price for two")
plt.show()

This graph shows us how the Price range is distributed around the aggregrate rating. The maximum number of restaurants falls in the 0 - 1000 price range and 2.5 to 4.0 rating.

Scatter Plot of Price Range vs Aggregate Rating¶

In [48]:
scatter_price_rating = final_data.plot.scatter('Aggregate rating','Votes',figsize = (7,5))
plt.title("Relationship betweeen Votes and Aggregate rating")
plt.show()

This graph shows us the relationship between the number of votes and Aggregrate Rating. We see that the maximum number of ratings lie between 3.5 to 4.8 whereas the frequency of votes which they have received are in the range 0-2000

PAIR PLOT¶

In [49]:
n = ['Price range', 'Aggregate rating', 'Votes', 'Average Cost for two']
sns.pairplot(final_data[n])
plt.show()
In [50]:
final_data['Restaurant Name'].value_counts()
Out[50]:
Cafe Coffee Day             83
Domino's Pizza              79
Subway                      63
Green Chick Chop            51
McDonald's                  48
                            ..
Odeon Social                 1
Johnny Rockets               1
House of Commons             1
HotMess                      1
Walter's Coffee Roastery     1
Name: Restaurant Name, Length: 7446, dtype: int64

Mean of Average Price for two people¶

In [51]:
final_data[["Average Cost for two"]].mean()
Out[51]:
Average Cost for two    1199.210763
dtype: float64

Thus the mean of Average Price for two people is 1199.210763

Are there any differences in the rating of restaurants with and without table reservations?¶

In [52]:
sns.boxplot(x = "Has Table booking", y = "Aggregate rating", data = final_data)
plt.title('The dependence of the rating on the availability of table reservations')
plt.show()

The restaurants that have table reservations have a rating of around 3.8 whereas those which do not have table booking have aggregrate rating of around 3.1. The lower rating for restaurants may be primarily because customers had to return due unavailibility of a table or they might have rated the restaurant lower simply because it did not have table booking. In contrast those having table booking are less in number and have a higher rating. This statistic may be biased because the number of restaurants are less. Still it seems like the customers are more satisfied with the restaurants having table booking. Customers tend to rate sophisticated restaurants highly because of psycholigical reasons or because simply the restaurants are good. Since one bad rating can bring down the average significantly as the number of restaurants are less.

Rating vs Availabilty of Delivery¶

In [53]:
sns.boxplot(x = "Is delivering now", y = "Aggregate rating", data = final_data)
plt.title('The dependence of the rating on the availability of delivery')
plt.show()

This box plot clearly shows that restaurants have almost no connection with the rating when we take into consideration "The availability of Delivery". Restaurants having delivery have a rating a little less than 3.5 whereas those not having delivery, have a rating of just above 3.2

Delhi¶

From which Locality maximum hotels are listed in Delhi Zomato¶

In [54]:
import plotly.graph_objects as go
Delhi = data[(data.City == 'New Delhi')]
fig = go.Figure(data=[go.Bar(
    x=Delhi.Locality.value_counts().head(10).index,
    y=Delhi.Locality.value_counts().head(10),

)])

fig.show()

Connaught Place has the most number of restaurants in Delhi, around 122. Other localities do not lag behind.

Top 10 cuisines available¶

In [55]:
cuisine_val = data.Cuisines.value_counts()
cuisine_label = data.Cuisines.value_counts().index
fig = go.Figure(data=[go.Pie(labels=cuisine_label[:10], values=cuisine_val[:10], textinfo='label+percent',
                             insidetextorientation='radial',title='Top 10 Cuisine'
                            )])
fig.show()

How many of such restaurants accept online delivery¶

In [56]:
top_locality = Delhi.Locality.value_counts().head(10)
plt.figure(figsize=(12,6))
ax = sns.countplot(y= "Locality", hue="Has Online delivery", data=Delhi[Delhi.Locality.isin(top_locality.index)])
plt.title('Resturants Online Delivery');

Online Delivery seems to be on the higher side in Defence colony and Malviya Nagar. Other than Shahdara locality ,in other restaurants localities accept online delivery.

RATINGING VS AVG COST FOR 2¶

In [57]:
import plotly.express as px

fig = px.scatter(Delhi, x="Average Cost for two", y="Aggregate rating", color='Price range',)
fig.show()

This graph clearly indicates that the Rating does not depend on the average cost for two. Restaurants having lower ratings have high average cost for two and vice versa.

Location of Highly rated restaurants across New Delhi¶

In [58]:
Delhi['Rating text'].value_counts()
Out[58]:
Average      2495
Not rated    1425
Good         1128
Very Good     300
Poor           97
Excellent      28
Name: Rating text, dtype: int64
In [59]:
High_rating = Delhi[Delhi['Rating text'].isin(['Excellent'])]
fig = px.scatter_mapbox(High_rating, lat="Latitude", lon="Longitude", hover_name="City",
                        hover_data=["Aggregate rating", "Restaurant Name"],
                        color_discrete_sequence=["fuchsia"], zoom=10, height=300)
fig.update_layout(mapbox_style="open-street-map")
fig.update_layout(title='Highle rated Resturants Location',
                  autosize=True,
                  hovermode='closest',
                  showlegend=False)
fig.update_layout(
    autosize=False,
    width=800,
    height=500,)

fig.show()

Let's analyse Kolkata¶

In [60]:
k = data[(data.City == 'Kolkata')]
k.head(15)
Out[60]:
Restaurant ID Restaurant Name Country Code City Address Locality Locality Verbose Longitude Latitude Cuisines ... Currency Has Table booking Has Online delivery Is delivering now Switch to order menu Price range Aggregate rating Rating color Rating text Votes
2398 18217475 Asia Kitchen by Mainland China 1 Kolkata 4th Floor, Acropolis Mall, 1858/1, Rajdanga Ma... Acropolis Mall, Kasba Acropolis Mall, Kasba , Kolkata 88.393294 22.514688 Asian, Chinese ... Indian Rupees(Rs.) No Yes No No 3 4.6 Dark Green Excellent 945
2399 18249144 Hoppipola 1 Kolkata 4th Floor, Acropolis Mall, 1858/1, Rajdanga Ma... Acropolis Mall, Kasba Acropolis Mall, Kasba , Kolkata 88.393310 22.514585 Italian, Mexican, American, Mediterranean ... Indian Rupees(Rs.) No Yes No No 3 4.2 Green Very Good 1103
2400 18017612 Spice Kraft 1 Kolkata 54/1/2A, Hazra Road, Ballygunge Phari, Near Ha... Ballygunge Ballygunge, Kolkata 88.364453 22.526461 Continental, Middle Eastern, Asian ... Indian Rupees(Rs.) No No No No 3 4.8 Dark Green Excellent 1424
2401 18377112 Nawwarah 1 Kolkata 48A, Syed Amir Ali Avenue, Ballygunge, Kolkata Ballygunge Ballygunge, Kolkata 88.364878 22.538731 Chinese, Cafe, North Indian, Desserts ... Indian Rupees(Rs.) No No No No 3 3.9 Yellow Good 326
2402 20002 6 Ballygunge Place 1 Kolkata 6, Ballygunge Place, Ballygunge, Kolkata Ballygunge Ballygunge, Kolkata 88.368628 22.527893 Bengali ... Indian Rupees(Rs.) Yes Yes No No 3 4.4 Green Very Good 1778
2403 18343731 Mumbai Local 1 Kolkata 19, Ballygunge Park Road, Near Quest Mall, Bal... Ballygunge Ballygunge, Kolkata 88.366217 22.533662 North Indian, Chinese, Street Food ... Indian Rupees(Rs.) Yes No No No 3 4.2 Green Very Good 704
2404 25664 Gabbar's Bar & Kitchen 1 Kolkata 11/1, Ho Chi Minh Sarani, Camac Street Area, K... Camac Street Area Camac Street Area, Kolkata 88.350680 22.547186 North Indian, Chinese, Mexican, Italian ... Indian Rupees(Rs.) Yes No No No 3 4.4 Green Very Good 1484
2405 25587 TGI Friday's 1 Kolkata Forum Mall, 10/3, Elgin Road, Elgin, Kolkata Elgin Elgin, Kolkata 88.349843 22.537960 Tex-Mex, American ... Indian Rupees(Rs.) Yes Yes No No 3 4.0 Green Very Good 911
2406 24530 Santa's Fantasea 1 Kolkata 9, Ballygunge Terrace, Near Anjali Jewellers, ... Golpark Golpark, Kolkata 88.367830 22.515082 Seafood, Chinese ... Indian Rupees(Rs.) No No No No 2 4.2 Green Very Good 2584
2407 20747 India Restaurant 1 Kolkata Ground Floor, 1st Floor, 2nd Floor, 34, Karl M... Kidderpore Kidderpore, Kolkata 88.322337 22.538999 Biryani, North Indian, Chinese, Mughlai ... Indian Rupees(Rs.) Yes Yes No No 2 4.6 Dark Green Excellent 1219
2408 21220 Flame & Grill 1 Kolkata 4th Floor, Mani Square Mall, 164/1, E.M. Bypas... Mani Square Mall, Kankurgachi Mani Square Mall, Kankurgachi, Kolkata 88.400581 22.577821 North Indian, Continental ... Indian Rupees(Rs.) Yes No No No 3 3.9 Yellow Good 1064
2409 25570 Barbeque Nation 1 Kolkata 24, 1st Floor, Park Center Building, Park Stre... Park Street Area Park Street Area, Kolkata 88.354127 22.551084 North Indian, Chinese ... Indian Rupees(Rs.) No No No No 3 4.9 Dark Green Excellent 1753
2410 20350 Mocambo 1 Kolkata 25B Park Street, Park Street Area, Kolkata Park Street Area Park Street Area, Kolkata 88.353273 22.553227 Continental, Italian, North Indian ... Indian Rupees(Rs.) No Yes No No 3 3.5 Yellow Good 4464
2411 20870 BarBQ 1 Kolkata 43-47-55, Park Street Area, Kolkata Park Street Area Park Street Area, Kolkata 88.352310 22.552996 Chinese, North Indian ... Indian Rupees(Rs.) No Yes No No 2 4.2 Green Very Good 5288
2412 20404 Peter Cat 1 Kolkata 18A, Park Street, Park Street Area, Kolkata Park Street Area Park Street Area, Kolkata 88.352885 22.552672 Continental, North Indian ... Indian Rupees(Rs.) No Yes No No 3 4.3 Green Very Good 7574

15 rows × 21 columns

Highest number of restaurants under zomato services in Kolkata with online booking¶

In [61]:
fig = px.bar(k,
                   x=k.Locality,
                   #marginal='box',
                   color=k['Has Table booking'],
             #y=k.Locality.value_counts().head(10).index,
                   #color_discrete_sequence=['Grey', 'Red','Orange','Yellow','Green',"Darkgreen"],
                   title='Restaurants having table booking and its count for Kolkata')
fig.update_layout(bargap=0.1)
fig.show()

We can observe that number of restaurants offer table booking, most of them being in Park Street area.

Highest 25 costly restaurants for 2 in Kolkata:¶

In [62]:
k2=k.nlargest(25, 'Average Cost for two')
k2
Out[62]:
Restaurant ID Restaurant Name Country Code City Address Locality Locality Verbose Longitude Latitude Cuisines ... Currency Has Table booking Has Online delivery Is delivering now Switch to order menu Price range Aggregate rating Rating color Rating text Votes
2413 24286 The Irish House 1 Kolkata 5th Floor, Quest Mall, 33, Syed Ali Amir Avenu... Quest Mall, Ballygunge Quest Mall, Ballygunge, Kolkata 88.365507 22.539129 European, American ... Indian Rupees(Rs.) No No No No 3 4.4 Green Very Good 2224
2405 25587 TGI Friday's 1 Kolkata Forum Mall, 10/3, Elgin Road, Elgin, Kolkata Elgin Elgin, Kolkata 88.349843 22.537960 Tex-Mex, American ... Indian Rupees(Rs.) Yes Yes No No 3 4.0 Green Very Good 911
2416 24452 Sigree Global Grill 1 Kolkata 1st Floor, Silver Spring Arcade, EM Bypass, Sc... Silver Spring Arcade, Science City Area Silver Spring Arcade, Science City Area, Kolkata 88.400467 22.549100 North Indian ... Indian Rupees(Rs.) Yes No No No 3 4.1 Green Very Good 1616
2414 20842 Barbeque Nation 1 Kolkata K1, RDB Boulevard, Block EP & GP, Sector 5, Sa... Sector 5, Salt Lake Sector 5, Salt Lake, Kolkata 88.433452 22.569358 North Indian, Chinese ... Indian Rupees(Rs.) No No No No 3 4.9 Dark Green Excellent 5966
2409 25570 Barbeque Nation 1 Kolkata 24, 1st Floor, Park Center Building, Park Stre... Park Street Area Park Street Area, Kolkata 88.354127 22.551084 North Indian, Chinese ... Indian Rupees(Rs.) No No No No 3 4.9 Dark Green Excellent 1753
2408 21220 Flame & Grill 1 Kolkata 4th Floor, Mani Square Mall, 164/1, E.M. Bypas... Mani Square Mall, Kankurgachi Mani Square Mall, Kankurgachi, Kolkata 88.400581 22.577821 North Indian, Continental ... Indian Rupees(Rs.) Yes No No No 3 3.9 Yellow Good 1064
2415 18259462 Ocean Grill 1 Kolkata 1st Floor, Infinity Benchmark, Near RDB Cinema... Sector 5, Salt Lake Sector 5, Salt Lake, Kolkata 88.433187 22.569367 Continental, Seafood, North Indian, Asian ... Indian Rupees(Rs.) Yes No No No 3 3.6 Yellow Good 1040
2398 18217475 Asia Kitchen by Mainland China 1 Kolkata 4th Floor, Acropolis Mall, 1858/1, Rajdanga Ma... Acropolis Mall, Kasba Acropolis Mall, Kasba , Kolkata 88.393294 22.514688 Asian, Chinese ... Indian Rupees(Rs.) No Yes No No 3 4.6 Dark Green Excellent 945
2404 25664 Gabbar's Bar & Kitchen 1 Kolkata 11/1, Ho Chi Minh Sarani, Camac Street Area, K... Camac Street Area Camac Street Area, Kolkata 88.350680 22.547186 North Indian, Chinese, Mexican, Italian ... Indian Rupees(Rs.) Yes No No No 3 4.4 Green Very Good 1484
2399 18249144 Hoppipola 1 Kolkata 4th Floor, Acropolis Mall, 1858/1, Rajdanga Ma... Acropolis Mall, Kasba Acropolis Mall, Kasba , Kolkata 88.393310 22.514585 Italian, Mexican, American, Mediterranean ... Indian Rupees(Rs.) No Yes No No 3 4.2 Green Very Good 1103
2403 18343731 Mumbai Local 1 Kolkata 19, Ballygunge Park Road, Near Quest Mall, Bal... Ballygunge Ballygunge, Kolkata 88.366217 22.533662 North Indian, Chinese, Street Food ... Indian Rupees(Rs.) Yes No No No 3 4.2 Green Very Good 704
2400 18017612 Spice Kraft 1 Kolkata 54/1/2A, Hazra Road, Ballygunge Phari, Near Ha... Ballygunge Ballygunge, Kolkata 88.364453 22.526461 Continental, Middle Eastern, Asian ... Indian Rupees(Rs.) No No No No 3 4.8 Dark Green Excellent 1424
2410 20350 Mocambo 1 Kolkata 25B Park Street, Park Street Area, Kolkata Park Street Area Park Street Area, Kolkata 88.353273 22.553227 Continental, Italian, North Indian ... Indian Rupees(Rs.) No Yes No No 3 3.5 Yellow Good 4464
2412 20404 Peter Cat 1 Kolkata 18A, Park Street, Park Street Area, Kolkata Park Street Area Park Street Area, Kolkata 88.352885 22.552672 Continental, North Indian ... Indian Rupees(Rs.) No Yes No No 3 4.3 Green Very Good 7574
2402 20002 6 Ballygunge Place 1 Kolkata 6, Ballygunge Place, Ballygunge, Kolkata Ballygunge Ballygunge, Kolkata 88.368628 22.527893 Bengali ... Indian Rupees(Rs.) Yes Yes No No 3 4.4 Green Very Good 1778
2401 18377112 Nawwarah 1 Kolkata 48A, Syed Amir Ali Avenue, Ballygunge, Kolkata Ballygunge Ballygunge, Kolkata 88.364878 22.538731 Chinese, Cafe, North Indian, Desserts ... Indian Rupees(Rs.) No No No No 3 3.9 Yellow Good 326
2417 18017615 What's Up 1 Kolkata 122A, Southern Avenue, Kolkata Southern Avenue Southern Avenue, Kolkata 88.362504 22.514119 Cafe, Chinese, Continental ... Indian Rupees(Rs.) Yes No No No 3 4.0 Green Very Good 1126
2411 20870 BarBQ 1 Kolkata 43-47-55, Park Street Area, Kolkata Park Street Area Park Street Area, Kolkata 88.352310 22.552996 Chinese, North Indian ... Indian Rupees(Rs.) No Yes No No 2 4.2 Green Very Good 5288
2406 24530 Santa's Fantasea 1 Kolkata 9, Ballygunge Terrace, Near Anjali Jewellers, ... Golpark Golpark, Kolkata 88.367830 22.515082 Seafood, Chinese ... Indian Rupees(Rs.) No No No No 2 4.2 Green Very Good 2584
2407 20747 India Restaurant 1 Kolkata Ground Floor, 1st Floor, 2nd Floor, 34, Karl M... Kidderpore Kidderpore, Kolkata 88.322337 22.538999 Biryani, North Indian, Chinese, Mughlai ... Indian Rupees(Rs.) Yes Yes No No 2 4.6 Dark Green Excellent 1219

20 rows × 21 columns

Top 25 costly Resturants Location in Kolkata¶

In [63]:
import plotly.express as px


fig = px.scatter_mapbox(k2, lat="Latitude", lon="Longitude", hover_name="City", hover_data=["Aggregate rating",
                                                                                            "Restaurant Name","Average Cost for two",
                                                                                            "Has Table booking"],
                        color_discrete_sequence=["fuchsia"], zoom=10, height=300)
fig.update_layout(mapbox_style="open-street-map")
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
fig.update_layout(title='Top 25 costly Resturants Location',
                  autosize=True,
                  #hovermode='closest',
                  showlegend=False)
fig.update_layout(
    autosize=False,
    width=800,
    height=500,)

fig.show()

Top 25 costly restaurants¶

In [64]:
ax = px.bar(k2, x='Restaurant Name',
            y='Average Cost for two',
            hover_data=['Has Online delivery'] ,
            title = 'Top 25 costly restaurant')
ax.show()

FINAL INFERENCES & CONCLUSIONS¶

Inferences and Conclusions: We’ve drawn many inferences from the survey. Here’s a summary of a few of them:

  1. The dataset is skewed towards India and doesn’t represent the complete data of restaurants worldwide.
  1. Restaurants rating is categorized into six categories

    1. Not Rated

    2. Average

    3. Good

    4. Very Good

    5. Excellent

  1. They are also divided if they have table booking or not, or they have online ordering system.
  1. There is no relation between cost and rating. Some of the best-rated restaurants are low on cost and vice versa.
  1. Most of the restaurants are in India, to be precise 93.2%, this is understandable since Zomato is an Indian Company.
  1. Our dataset has negligible null values. Only Cuisine column had some null values.
  1. Not rated count is very high, this may happen mainly because customers do not like to review after having their food. This is why Zomato asks the users to to rate the restaurants after around 1 hour of food delivery. This may prompt the customers to appreciate the food they had. If they had to criticise, they would have done it already.
  1. Clearly, among all the restaurants, orange rated(average)(2.5-3.4) is the most common frequent rating.
  1. The highest number of ratings recieved is around 3.0 to 3.8, this may happen because the number of restaurants which have high rating is low in number. India has the most number of restaurants and many restaurants fall into the bucket of 3 to 4 rating range.
  1. 74% or almost 3/4th of the total restaurants do not accept online orders. This may be due to a variety of reasons such as, maybe the restaurants are of small scale therefore they do not have enough profit margin while selling through Zomato, or the restaurant is of huge scale. I have been to some restaurants where the prices start at Rs. 800-900 for just one dish! This makes it clear that such restaurants will not be having online food deliveries, because after a meal, just the tax is around 300-400, with which we can have a full fledged meal at a good restaurant. I would like to add that some restaurants simply do not want to deliver online, because they choose not to, do not want the hassle or maybe due some orthodox beliefs. These restaurants are small scale, but large in number.
  1. The highest number of cuisines are offered by Cafes(8) followed by Italian and so on.
  1. Most number of costly restaurants are located in Jakarta and the least in Bogor.
  1. The maximum number of restaurants falls in the 0 - 1000 price range and 2.5 to 4.0 rating.
  1. Delhi has a lot of restaurants listed on Zomato. Connaught place has over 120 restaurants listed.